from drf_yasg.utils import swagger_auto_schema
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet

from erp_system.models import RolesModel, PermissionsModel, Menu
from erp_system.serializers.roles_serialzier import RolesPartialSerializer, RoleSetPermissionSerializer, RolesSerializer


class RolesViewSet(ModelViewSet):
    #  整个ERP系统有一个默认存在的角色（特殊）， admin角色。这个角色不允许删除
    """
    create:
    角色--新增

    角色新增, status: 201(成功), return: 新增角色信息

    destroy:
    角色--删除

    角色删除, status: 204(成功), return: None

    multiple_delete:
    角色--批量删除,必传参数：ids=[1,2,3,4...]

    角色批量删除, status: 204(成功), return: None

    update:
    角色--修改,不能修改角色，只是修改角色名字。

    角色修改, status: 200(成功), return: 修改后的角色信息

    partial_update:
    角色--(不需要)局部修改(角色批量授权),针对某一个角色批量授权，之前存在的不变，之前没有的会增加权限

    角色批量授权, status: 200(成功), return: 修改后的角色信息

    set_permission_to_role:
    角色--单个授权，一次只能授予角色一个permission，也可以取消一个permission
    status: 200(成功), return: 修改后的角色信息

    list:
    角色--获取列表

    角色列表信息, status: 200(成功), return: 角色信息列表

    retrieve:
    查询某一个角色

    查询指定ID的角色, status: 200(成功), return: 用户角色
    """

    queryset = RolesModel.objects.all()

    def get_serializer_class(self):
        """
        不同的视图函数采用的序列化器是不一样的
        :return:
        """
        if self.action == 'partial_update':
            return RolesPartialSerializer
        elif self.action == 'set_permission_to_role':
            return RoleSetPermissionSerializer
        else:
            return RolesSerializer

    @swagger_auto_schema(method='POST', request_body=RoleSetPermissionSerializer, operation_description='单一授权或者取消单一权限')
    @action(methods=['POST'], detail=False)
    def set_permission_to_role(self, request, *args, **kwargs):
        ser: RoleSetPermissionSerializer = self.get_serializer(data=request.data)
        if ser.is_valid():
            role = RolesModel.objects.get(id=ser.validated_data.get('role_id'))
            permission = PermissionsModel.objects.get(id=ser.validated_data.get('permission_id'))
            if ser.validated_data.get('is_create'):
                #  判断给当前角色新增一个权限, 首先判断该权限所对应的父菜单权限是否已经被授予了
                parent = Menu.objects.filter(id=permission.menu.id).values_list('parent', flat=True).all()
                if parent:
                    p_permission = PermissionsModel.objects.get(menu_id=parent[0])
                    role.permissions.add(p_permission)
                role.permissions.add(permission)
            else:  # 取消权限
                role.permissions.remove(permission)

            return Response(data=RolesSerializer(instance=role).data)


    def destroy(self, request, *args, **kwargs):
        if self.get_object().name == 'admin':
            return Response(data={'detail': 'admin角色不可删除'}, status=status.HTTP_400_BAD_REQUEST)
        else:
            pass